Bienvenid@s a la primera tarea del curso Statistical Thinking. Esta tarea tiene como objetivo evaluar los contenidos teóricos de la primera parte del curso, los cuales se enfocan principalmente en análisis exploratorio de datos y conceptos introductorios de probabilidades. Si aún no han visto las clases, se recomienda visitar los enlaces de las referencias.
La tarea consta de ejercicios prácticos con el fín de introducirlos a la programación en R enfocada en el análisis estadístico de datos.
En la siguiente sección deberá resolver cada uno de los experimentos computacionales a través de la programación en R. Para esto se le aconseja que cree funciones en R, ya que le facilitará la ejecución de gran parte de lo solicitado.
Para esta pregunta usted deberá trabajar en base al conjunto de datos
hearth_database.csv, el cual esta compuesto por las
siguientes variables:
En base al dataset propuesto realice un análisis exploratorio de los datos (EDA). Para su análisis enfoquen el desarrollo en las siguientes tareas:
Respuesta Se crean los vectores means, medians y maxes que contienen las medias, medianas y máximos respectivamente de las columnas numéricas. Esto se compara con lo dado por la función summary y vemos que se condice. Luego se calculan los quintiles y se guardan en el dataset quintils. El código utilizado es el siguiente:
# Libraries installed to plot, correlation matrix and boxplots (run this code only once)
install.packages("corrplot")
install.packages("ggplot2")
library(corrplot)
## corrplot 0.94 loaded
library(ggplot2)
# To avoid warning messages
options(warn = -1)
# Import and reading of csv file hearth_database.csv
hearth_database <- read.table(file="hearth_database.csv",header=T,sep=",")
# Selecting of numeric attributes
numeric_attrs <- c("slope", "ca", "thal", "age", "trestbps", "chol", "thalach", "oldpeak")
# Obtaining of the mean, median and maxes for each numeric attribute
# means, medians and maxes are saved on vectors of their respective names
# Calculate the mean of each numeric attribute
means_all <- sapply(hearth_database, mean)
means <- means_all[numeric_attrs]
rm(means_all)
# Calculate the median of each numeric attribute
medians_all <- sapply(hearth_database, median)
medians <- sapply(medians_all[numeric_attrs], as.numeric)
rm(medians_all)
# Calculate the maximum of each numeric attribute
maxes_all <- sapply(hearth_database, max)
maxes <- sapply(maxes_all[numeric_attrs], as.numeric)
rm(maxes_all)
# Calculate the quintils of each numeric attribute
quintils <- lapply(hearth_database[numeric_attrs], function(col) {
quantile(col, probs=seq(0, 1, by = 0.2), na.rm=TRUE)
})
# Printing the vectors with the metric and quintils for each attribute
print(means)
## slope ca thal age trestbps chol
## 1.3993399 0.7293729 2.3135314 54.3663366 131.6237624 246.2640264
## thalach oldpeak
## 149.6468647 1.0396040
print(medians)
## slope ca thal age trestbps chol thalach oldpeak
## 1.0 0.0 2.0 55.0 130.0 240.0 153.0 0.8
print(maxes)
## slope ca thal age trestbps chol thalach oldpeak
## 2.0 4.0 3.0 77.0 200.0 564.0 202.0 6.2
print(quintils)
## $slope
## 0% 20% 40% 60% 80% 100%
## 0 1 1 2 2 2
##
## $ca
## 0% 20% 40% 60% 80% 100%
## 0 0 0 1 2 4
##
## $thal
## 0% 20% 40% 60% 80% 100%
## 0 2 2 2 3 3
##
## $age
## 0% 20% 40% 60% 80% 100%
## 29 45 53 58 62 77
##
## $trestbps
## 0% 20% 40% 60% 80% 100%
## 94 120 126 134 144 200
##
## $chol
## 0% 20% 40% 60% 80% 100%
## 126.0 204.0 230.0 254.0 285.2 564.0
##
## $thalach
## 0% 20% 40% 60% 80% 100%
## 71 130 146 159 170 202
##
## $oldpeak
## 0% 20% 40% 60% 80% 100%
## 0.00 0.00 0.38 1.12 1.90 6.20
# Use of summary to compare
summary(hearth_database)
## target sex fbs exang
## Length:303 Length:303 Length:303 Length:303
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## cp restecg slope ca
## Length:303 Length:303 Min. :0.000 Min. :0.0000
## Class :character Class :character 1st Qu.:1.000 1st Qu.:0.0000
## Mode :character Mode :character Median :1.000 Median :0.0000
## Mean :1.399 Mean :0.7294
## 3rd Qu.:2.000 3rd Qu.:1.0000
## Max. :2.000 Max. :4.0000
## thal age trestbps chol
## Min. :0.000 Min. :29.00 Min. : 94.0 Min. :126.0
## 1st Qu.:2.000 1st Qu.:47.50 1st Qu.:120.0 1st Qu.:211.0
## Median :2.000 Median :55.00 Median :130.0 Median :240.0
## Mean :2.314 Mean :54.37 Mean :131.6 Mean :246.3
## 3rd Qu.:3.000 3rd Qu.:61.00 3rd Qu.:140.0 3rd Qu.:274.5
## Max. :3.000 Max. :77.00 Max. :200.0 Max. :564.0
## thalach oldpeak
## Min. : 71.0 Min. :0.00
## 1st Qu.:133.5 1st Qu.:0.00
## Median :153.0 Median :0.80
## Mean :149.6 Mean :1.04
## 3rd Qu.:166.0 3rd Qu.:1.60
## Max. :202.0 Max. :6.20
Luego mostramos la matriz de correlación de Pearson para los atributos numéricos:
# Calculate the Pearson correlation matrix
correlation_matrix <- cor(hearth_database[numeric_attrs], use="complete.obs", method="pearson")
# Visualization of the correlation matrix
corrplot(correlation_matrix, method="square")
Y creamos un boxplot para cada atributo numérico:
# Loop through each numeric attrbute and plot a boxplot
for (col in names(hearth_database[numeric_attrs])) {
boxplot(hearth_database[col],main=paste("Boxplot of", col),xlab=col,ylab="Values")
rm(col)
}
Finalmente mostramos mediante un histograma como distribuyen las variables respecto al TARGET:
# Separate the dataset into two subsets
yes_target <- subset(hearth_database, target=="YES")
no_target <- subset(hearth_database, target=="NO")
# Loop through each numeric attrbute and plot a density histogram
for (col in names(hearth_database[numeric_attrs])) {
plot(density(as.numeric(yes_target[[col]])), main=paste("Density of", col, "for targets with hearth problems"))
plot(density(as.numeric(no_target[[col]])), main=paste("Density of", col, "for targets without hearth problems"))
rm(col)
}
rm(yes_target)
rm(no_target)
Pruebe el teorema central del limite aplicando un muestreo de la media en las distribuciones Gamma, Normal y una a su elección. Grafique los resultados obtenidos y señale aproximadamente el numero de muestreos necesarios para obtener el resultado esperado, pruebe esto con las siguientes cantidades de muestreo \(\{10,100,1000,5000\}\). ¿El efecto ocurre con el mismo número de muestreo para todas las distribuciones?.
Respuesta
# Definición de variables o estructuras necesarias para el muestreo.
n <- 1000
# Realizar el muestreo de las distribuciones.
for(i in 1:n) {
}
# Código para gráficos
Realice el experimento de lanzar una moneda cargada 1000 veces y observe el comportamiento que tiene la probabilidad de salir cara. Para realizar el experimento considere que la moneda tiene una probabilidad de \(5/8\) de salir cara. Grafique el experimento para las secuencias de intentos que van desde 1 a 1000, señalando el valor en que converge la probabilidad de salir cara.
Respuesta
# Simular lanzamientos
for (lanzamientos in 1:1000) {
}
# Gráfico de la convergencia
Remontándonos en la televisión del año 1963, en USA existía un programa de concursos donde los participantes debían escoger entre 3 puertas para ganar un premio soñado. El problema del concurso era que solo detrás de 1 puerta estaba el premio mayor, mientras que detrás de las otras dos habían cabras como “premio”.
Una de las particularidades de este concurso, es que cuando el participante escogía una puerta, el animador del show abría una de las puertas que no fue escogida por el participante (Obviamente la puerta abierta por el animador no contenía el premio). Tras abrir la puerta, el animador consultaba al participante si su elección era definitiva, o si deseaba cambiar la puerta escogida por la otra puerta cerrada. Un vídeo que puede ayudar a comprender mejor este problema en el siguiente link.
Imagine que usted es participante del concurso y desea calcular la probabilidad de ganar el gran premio si cambia de puerta en el momento que el animador se lo ofrece. Utilizando listas/arrays/vectores simule las puertas del concurso, dejando aleatoriamente el premio en alguna posición del array. Hecho esto, genere un numero de forma aleatoria para escoger una de las puerta (posiciones de la estructura), para luego ver si cambiando de posición tendrá mayores posibilidades de ganar el premio. Genere N veces el experimento y grafique cada una de las iteraciones, tal como se hizo en el ejercicio de las monedas.
Respuesta:
# Creamos una función que simule el juego
montyhall <- function(cambiar = TRUE){
Puertas <- sample(1:3,3) #Puertas donde la posición que tiene el 3 es el premio
posicion <- sample(1:3,1) #Elección del participante.
return(Eleccion) # Retornamos la elección, esta puede que tenga el premio o no
}
# Función que simula N juegos
n_juegos <- function(n = 10 ,cambiar_puerta = TRUE){
}
Ustedes disponen de los dados D1 y D2, los cuales no están cargados y son utilizados para comprobar que \(\mathbb{P}(AB)=\mathbb{P}(A)\mathbb{P}(B)\) cuando el evento A es independiente del B. Para estudiar la independencia considere que los eventos A y B se definen de la siguiente manera; sea A el evento dado por los valores obtenidos en el lanzamiento del dado D1, este está compuesto por \(A=\{D1=1,D1=2,D1=6\}\). Por otro lado, el evento B viene dado por los valores obtenidos con el dado D2, el que está conformado por \(B=\{D2=1,D2=2,D2=3,D2=4\}\). Con esto, tendremos un \(\mathbb{P}(A)=1/2\), \(\mathbb{P}(𝐵)=2/3\) y \(\mathbb{P}(AB)=1/3\). Compruebe de forma gráfica que al realizar 1000 lanzamientos (u otro valor grande que usted desea probar) se visualiza que \(\mathbb{P}(AB)=\mathbb{P}(A)\mathbb{P}(B)\).
Hecho lo anterior, compruebe el comportamiento de un segundo grupo de eventos, dados por el lanzamiento de solo el dado D1. Donde, los eventos para D1 quedan definidos como: \(A =\{D1=1,D1=2,D1=6\}\) y \(B=\{D1=1,D1=2,D1=3\}\). ¿Se observa independencia en este experimento?.
Se le aconseja que para simular los lanzamientos de dados utilice la
función sample() para generar valores aleatorios entre 1 y
6. Compruebe los números generados por la función con los casos
favorables de cada uno de los eventos a ser estudiados.
Respuesta:
# Primer grupo de eventos
N_lan = 1000 # Numero de lanzamientos
L_A = # Lanzamientos favorables A = c(1, 2, 6)
L_B = # Lanzamientos favorables B = c(1, 2, 3, 4)
L_AB = # Lanzamientos favorables AB = c(1, 2)
# Segundo grupo de eventos
N_lan = 1000 # Numero de lanzamientos
L_A = # Lanzamientos favorables A = c(1, 2, 6)
L_B = # Lanzamientos favorables B = c(1, 2, 3)
L_AB = # Lanzamientos favorables AB = c(1, 2)
Un amigo ludópata suyo le comenta que el truco de jugar en el casino esta en no parar de apostar y apostando lo mínimo posible. Ya que así, tienes mas probabilidades de ganar el gran pozo que acumula el juego. Usted sabiendo la condición de su amigo, decide no creer en su conjetura y decide probar esto a través de un experimento.
Para realizar el experimento usted decide asumir las siguientes declaraciones, bajo sus observaciones:
En el primer experimento deberá obtener la evolución de los fondos hasta que el jugador se queda sin fondos para jugar. Puede ser útil seguir la lógica de una moneda cargada para realizar esto. Pruebe esto con una apuesta igual a 5, 25 y 50 graficando los resultados. Comente los resultados obtenidos.
Para la segunda parte de este experimento, con las funciones ya creadas, proyecte 5000 apuestas y obtenga la probabilidad a la que converge el experimento empezando con una apuesta de: 5, 25 y 50. Para este experimento considerar como éxito (1) cuando su función ruina supera los 200 y considere lo contrario cuando su función perdida es menor o igual a 0.
Respuesta
# Función para obtener el desarrollo de las apuestas
ruina <- function(fondos = 100, apuesta = 5){
while (0<fondos & fondos<200) {
}
return(vec_fondos) # Devuelve un vector con el desarrollo de los fondos
}
plot(ruina(), type="l", col="blue", xlab="N° de juegos", ylab="Fondos", main="Evolución de los fondos (apuesta = 5)")
plot(ruina(apuesta = 25), type="l", col="blue", xlab="N° de juegos", ylab="Fondos", main="Evolución de los fondos (apuesta = 25)")
plot(ruina(apuesta = 50), type="l", col="blue", xlab="N° de juegos", ylab="Fondos", main="Evolución de los fondos (apuesta = 50)")
A work by CC6104